#include "get_default_attr.h"

static bool ever_get=false;
static size_t time_beg;
static int time_str_len;
static size_t scenario_beg;

/** 
 * 用正则匹配日期（匹配其他内容也可）
 * https://lxblog.com/qianwen/share?shareId=21cd0813-f2a2-4574-af4a-af20489db7bb
 */
std::string get_time(const std::string& line_cur){
	// 做个假设：日志中日期总在最开头输出，这样找一次之后就可用.substr()截取时间
	// 定义正则表达式来匹配日期格式
	if(!ever_get){
        std::regex time_regex(TIME_REGEX);
		
		// 创建一个迭代器遍历所有匹配项（通常日志里只会命中一次时间）
        auto match_beg=std::sregex_iterator(line_cur.begin(), line_cur.end(), time_regex);

		// 通常时间只打印一次，因此可以这么写
        std::smatch time_match;
		if(regex_search(line_cur, time_match, time_regex)){
			time_beg=time_match.position();
			time_str_len=time_match.length();
			ever_get=true;
			return time_match.str();
		}
	}
	/** 
	 * 如果之前找过一次时间字段，那么后续不用正则因为正则太慢
	 * 这样做需要基于以下假设：
	 * 	1. 时间字段长度保持不变
	 * 	2. 时间字段在一行中总是处于相同的位置（这里认为总是处于开头）
	 */
	else{
		std::string time_str="";
		time_str=line_cur.substr(time_beg, time_str_len);
		return time_str;
	}

	return "";
}

/** 
 * 不具备通用性
 * 根据该字段紧挨着时间字段来截取的，并不通用
 */
std::string get_scenario(const std::string& line_cur){
	// 该字段紧跟时间之后
	size_t scenario_beg;
	size_t scenario_end;
	scenario_beg=time_beg+time_str_len;
	scenario_end=scenario_beg;
	scenario_beg=line_cur.find_first_of('[', scenario_beg);
	// 最终scenario_end指向策略名称末尾后一位字符
	scenario_end=line_cur.find_first_of(']', scenario_beg);
	scenario_beg++;
	size_t scenario_str_len;
	scenario_str_len=scenario_end-scenario_beg;
	std::string scenario_str="";
	scenario_str=line_cur.substr(scenario_beg, scenario_str_len);
	return scenario_str;
}
